package gen

import (
	"gorm.io/driver/mysql"
	"gorm.io/driver/postgres"
	"gorm.io/gen"
	"gorm.io/gen/field"
	"gorm.io/gorm"
)

func GenModel(dsn, table string) {
	GenPostgreSqlModel(dsn, table)
}

func GenModelMysql(dsn, table string) {
	GenMysqlModel(dsn, table)
}

func GenPostgreSqlModel(dsn, table string) {
	genner := gen.NewGenerator(gen.Config{
		OutPath:           modelOutPath,
		Mode:              gen.WithoutContext | gen.WithDefaultQuery,
		FieldNullable:     false, // Null 指针类型
		FieldWithIndexTag: true,
		FieldWithTypeTag:  false,
	})

	// 数据源
	//db, err := gorm.Open(mysql.Open(dsn))
	db, err := gorm.Open(postgres.Open(dsn))
	if err != nil {
		panic(err)
	}

	genner.UseDB(db)

	genner.GenerateModel(table,
		gen.FieldGORMTagReg("", func(tag field.GormTag) field.GormTag { return tag.Remove("default") }),       // gorm标签不带default
		gen.FieldGORMTagReg("", func(tag field.GormTag) field.GormTag { return tag.Remove("not null") }),      // gorm标签不带not null
		gen.FieldGORMTagReg("", func(tag field.GormTag) field.GormTag { return tag.Remove("comment") }),       // gorm标签不带comment
		gen.FieldGORMTagReg("", func(tag field.GormTag) field.GormTag { return tag.Remove("index") }),         // gorm标签不带index
		gen.FieldGORMTagReg("", func(tag field.GormTag) field.GormTag { return tag.Remove("uniqueIndex") }),   // gorm标签不带uniqueIndex
		gen.FieldGORMTagReg("", func(tag field.GormTag) field.GormTag { return tag.Remove("autoIncrement") }), // gorm标签不带autoIncrement
		gen.FieldGORMTagReg("", func(tag field.GormTag) field.GormTag { return tag.Remove("primaryKey") }),    // gorm标签不带primaryKey

		gen.FieldNewTagWithNS("form", func(columnName string) string { return columnName }), //加上form 标签
	)
	genner.Execute()
}

func GenMysqlModel(dsn, table string) {
	genner := gen.NewGenerator(gen.Config{
		OutPath:           modelOutPath,
		Mode:              gen.WithoutContext | gen.WithDefaultQuery,
		FieldNullable:     false, // Null 指针类型
		FieldWithIndexTag: true,
		FieldWithTypeTag:  false,
	})

	// 数据源
	db, err := gorm.Open(mysql.Open(dsn))
	if err != nil {
		panic(err)
	}

	genner.UseDB(db)

	genner.GenerateModel(table,
		gen.FieldGORMTagReg("", func(tag field.GormTag) field.GormTag { return tag.Remove("default") }),       // gorm标签不带default
		gen.FieldGORMTagReg("", func(tag field.GormTag) field.GormTag { return tag.Remove("not null") }),      // gorm标签不带not null
		gen.FieldGORMTagReg("", func(tag field.GormTag) field.GormTag { return tag.Remove("comment") }),       // gorm标签不带comment
		gen.FieldGORMTagReg("", func(tag field.GormTag) field.GormTag { return tag.Remove("index") }),         // gorm标签不带index
		gen.FieldGORMTagReg("", func(tag field.GormTag) field.GormTag { return tag.Remove("uniqueIndex") }),   // gorm标签不带uniqueIndex
		gen.FieldGORMTagReg("", func(tag field.GormTag) field.GormTag { return tag.Remove("autoIncrement") }), // gorm标签不带autoIncrement
		gen.FieldGORMTagReg("", func(tag field.GormTag) field.GormTag { return tag.Remove("primaryKey") }),    // gorm标签不带primaryKey

		gen.FieldNewTagWithNS("form", func(columnName string) string { return columnName }), //加上form 标签
	)
	genner.Execute()
}
